import os
import requests
from bs4 import BeautifulSoup
from urllib.parse import urljoin
import pandas as pd

def fetch_project_weekly_reports(base_url, num_pages):
    """
    爬取指定URL下的项目周报列表，包括标题、内容摘要和链接。
    
    参数:
        base_url (str): 基础URL。
        num_pages (int): 需要爬取的页数。
        
    返回:
        list: 包含字典的列表，每个字典包含一个项目的标题、内容摘要和链接。
    """
    all_reports = []
    
    for page in range(1, num_pages + 1):
        # 构建每一页的URL
        if page == 1:
            url = base_url
        else:
            url = f"{base_url}?page={page}"
        
        print(f"正在爬取第 {page} 页: {url}")
        
        # 发起HTTP GET请求
        response = requests.get(url)
        # 检查请求是否成功
        if response.status_code == 200:
            # 使用BeautifulSoup解析HTML
            soup = BeautifulSoup(response.text, 'html.parser')
            # 找到所有项目周报的条目
            items = soup.find_all('div', class_='media-body')
            
            for item in items:
                # 提取标题
                title_tag = item.find('a')
                title = title_tag.get_text(strip=True) if title_tag else "标题无法获取"
                
                # 提取链接
                link = title_tag['href'] if title_tag and 'href' in title_tag.attrs else "链接无法获取"
                # 使用urljoin确保链接是完整的URL
                link = urljoin(base_url, link)
                
                # 提取内容摘要
                summary_tag = item.find('p')
                summary = summary_tag.get_text(strip=True) if summary_tag else "摘要无法获取"
                
                # 获取文章具体内容
                main_sub_pairs = fetch_article_details(link)
                
                for main_title, sub_title in main_sub_pairs:
                    all_reports.append({
                        'title': title,
                        'link': link,
                        'summary': summary,
                        'main_title': main_title,
                        'sub_title': sub_title
                    })
        else:
            print(f"请求失败，状态码：{response.status_code}, URL: {url}")
    
    return all_reports

def fetch_article_details(url):
    """
    爬取指定URL的文章具体内容，提取主副标题配对。
    
    参数:
        url (str): 文章的URL。
        
    返回:
        list of tuples: [(主标题, 副标题)]
    """
    # 发起HTTP GET请求
    response = requests.get(url)
    # 检查请求是否成功
    if response.status_code == 200:
        # 使用BeautifulSoup解析HTML
        soup = BeautifulSoup(response.text, 'html.parser')
        # 假设文章内容在特定的 <div> 标签中
        content_div = soup.find('div', class_='news-details-content fontZoom f_113')
        if content_div:
            # 提取主副标题配对
            main_sub_pairs = []
            main_title = None
            
            paragraphs = content_div.find_all('p')
            
            for p in paragraphs:
                if 'text-align: center;' in p.get('style', ''):
                    strong_tag = p.find('strong')
                    if strong_tag:
                        if main_title is not None:
                            main_sub_pairs.append((main_title, ""))
                        main_title = strong_tag.get_text(strip=True)
                elif 'text-align: justify;' in p.get('style', ''):
                    if main_title is not None:
                        main_sub_pairs.append((main_title, ""))
                        main_title = None
            
            # 处理最后一个主标题
            if main_title is not None:
                main_sub_pairs.append((main_title, ""))
            
            return main_sub_pairs
        else:
            print(f"未找到文章内容，URL: {url}")
            return []
    else:
        print(f"请求失败，状态码：{response.status_code}, URL: {url}")
        return []

if __name__ == '__main__':
    # 需要爬取的网站基础URL
    base_url = 'https://www.yidaiyilu.gov.cn/list/w/xmzb'
    # 需要爬取的页数
    num_pages = 15
    
    # 获取项目周报列表
    project_reports = fetch_project_weekly_reports(base_url, num_pages)
    
    # 将数据转换为DataFrame
    df = pd.DataFrame(project_reports)
    
    # 创建输出目录
    output_dir = 'output'
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)
    
    # 保存为Excel文件
    output_file = os.path.join(output_dir, 'project_weekly_reports.xlsx')
    df.to_excel(output_file, index=False)
    
    print(f"数据已保存到 {output_file}")